
/*
 * @Author: 肖思汗 
 * @Date: 2025-05-17 10:57:41 
 * @Last Modified by: xiaosihan
 * @Last Modified time: 2025-10-15 14:00:43
 */

import axios from "axios";
import Api from "./Api";
import utils from "@/utils/utils";
import OSS from "ali-oss";

//接口模版
class UtilsApi extends Api {

    constructor() {
        super();
    }

    // oss 客户端
    ossClient?: OSS;

    // 获取上传令牌中
    getkeying = false;

    //上传到oss
    async uploadOss(file: File): Promise<string> {

        if (!this.ossClient && !this.getkeying) {
            this.getkeying = true;

            const OSS = (await import("ali-oss")).default;

            // 获取oss 上传令牌
            const result = await this._post("/get_oss_sts");

            this.ossClient = new OSS({
                // yourRegion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。
                region: "oss-cn-shanghai",
                // region: 'oss-cn-chengdu',
                // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
                accessKeyId: result.data.AccessKeyId,
                accessKeySecret: result.data.AccessKeySecret,
                // 从STS服务获取的安全令牌（SecurityToken）。
                stsToken: result.data.SecurityToken,
                // 刷新临时访问凭证的时间间隔，单位为毫秒。
                refreshSTSTokenInterval: 300000,
                // 填写Bucket名称。
                bucket: "www-3dkeshihua",
            });

            this.getkeying = false;

            // 在有效时间结束后销毁 oss 实例 以便从新获取令牌
            setTimeout(() => {
                this.ossClient = undefined;
            }, 3600 * 1000);

        }

        // 等待oss 初始完成
        while (this.getkeying) {
            await new Promise(resolve => setTimeout(resolve, 50));
        }

        // 设置文件名
        const fileName = await new Promise(async (resolve1, reject1) => {
            let end = file.name.slice(-3);
            let id = utils.uuid();

            if (/(jpg|png|peg|ebp)/i.test(end)) {

                const img = new Image();

                await new Promise((resolve2, reject2) => {
                    img.onload = () => resolve2(img);
                    img.onerror = reject2;
                    img.src = URL.createObjectURL(file);
                });

                resolve1(`/upload/${img.width}_${img.height}_${file.size}_${id}.${end}`);
            } else {
                resolve1(`/upload/${id}.${end}`);
            }
        });

        if (this.ossClient) {
            const result = await this.ossClient.put(
                `${fileName}`,
                file,
                {
                    headers: {
                        // 指定上传文件的类型。
                        // 'Content-Type': 'image/png',
                        // 指定该Object被下载时网页的缓存行为。
                        // 'Cache-Control': 'no-cache',
                        'Cache-Control': 'max-age=99999999', // 
                        // 指定该Object被下载时的名称。
                        // 'Content-Disposition': 'oss_download.txt',
                        // 指定该Object被下载时的内容编码格式。
                        'Content-Encoding': 'UTF-8',
                        // 指定Object的存储类型。
                        'x-oss-storage-class': 'Standard',
                        // 指定Object的访问权限。
                        // 'x-oss-object-acl': 'private',
                        // 设置Object的标签，可同时设置多个标签。
                        // 'x-oss-tagging': 'Tag1=1&Tag2=2',
                        // 指定CopyObject操作时是否覆盖同名目标Object。此处设置为true，表示禁止覆盖同名Object。
                        'x-oss-forbid-overwrite': 'true',
                    },
                }
            ).catch(err => {
                return undefined;
            });

            if (result) {
                result.url = result.url.replace(/https?:/, "");
                return result.url;
            } else {
                this.ossClient = undefined;
                return await this.uploadOss(file);
            }

        } else {
            return await this.uploadOss(file);
        }

    }




}

const utilsApi = new UtilsApi();

export default utilsApi;